package com.example.ad.sdk.domain.view

import android.content.Context
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.example.ad.sdk.domain.extensions.notNull
import java.util.UUID

/**
 * BaseActivity 是一个抽象基类，用于封装 Activity 的通用功能和逻辑。
 * 它提供了页面初始化、沉浸式状态栏设置、加载框显示与隐藏等功能，适用于所有需要继承 Activity 的模块化开发场景。
 *
 * ### 主要功能
 * 4. **屏幕适配**：重写 [getResources] 方法，支持全局密度转换以适配不同屏幕尺寸。
 * 5. **页面唯一标识符**：通过 [getPageId] 方法生成并缓存页面唯一标识符。
 * 6. **应用重启保护**：在 [onCreate] 方法中检测是否存在 savedInstanceState，如果存在则重新启动应用以防止数据丢失。
 *
 * ### 关键属性
 * - [pageId]: 当前页面的唯一标识符，默认为空。如果未设置，则在首次调用 [getPageId] 时生成一个随机 UUID。
 *
 * ### 生命周期方法
 * - [onCreate]: 初始化页面布局、视图绑定以及沉浸式状态栏。
 *
 * ### 使用场景
 * - 适用于所有需要继承 Activity 的模块化开发场景。
 * - 提供了统一的生命周期管理和页面初始化逻辑，减少重复代码。
 */
abstract class BaseActivity : AppCompatActivity() {

    /**
     * 页面唯一标识符，默认为空。如果未设置，则在首次调用 [getPageId] 时生成一个随机 UUID。
     */
    private var pageId: String? = null

    /**
     * Activity 生命周期回调方法，用于初始化页面布局和视图。
     *
     * @param savedInstanceState 保存的实例状态，可能为 null。
     */
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 初始化视图绑定或布局 ID，并设置内容视图
        initDataBind().notNull(
            { setContentView(it) },
            { setContentView(layoutId()) }
        )
        // 初始化视图和沉浸式状态栏
        initRenderers(savedInstanceState)
    }

    override fun attachBaseContext(newBase: Context?) {
    }

    /**
     * 子类必须实现此方法，返回当前页面的布局资源 ID。
     *
     * @return 当前页面的布局资源 ID。
     */
    abstract fun layoutId(): Int

    /**
     * 初始化渲染器。
     * 该抽象方法用于在子类中实现具体的渲染器初始化逻辑。
     * 子类需要根据具体需求实现此方法，以确保渲染器正确初始化。
     */
    abstract fun initRenderers(savedInstanceState: Bundle?)

    /**
     * 提供给子类 BaseVmDbActivity 使用，用于初始化 ViewBinding 操作。
     *
     * @return 返回初始化完成的 View 对象，如果不需要 ViewBinding 则返回 null。
     */
    abstract fun initDataBind(): View?

    /**
     * 获取页面唯一标识符。如果尚未生成，则生成一个随机 UUID 并缓存。
     *
     * @return 页面唯一标识符字符串。
     */
    fun getPageId(): String {
        val pageId = pageId
        if (pageId != null) {
            return pageId
        }
        return UUID.randomUUID().toString().replace("-", "").also {
            this.pageId = it
        }
    }
}
